/*
 *    Copyright © OpenAtom Foundation.
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *         http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */

package com.inspur.edp.bff.api.manager;

/**
 * FSManager工厂接口，提供了创建FSManager的几种方式。
 * <p>此接口中的方法大部分需要提供configId参数。下面简单介绍一下configId：
 * <ul><li>configId是一个VO元数据的唯一标识，除一些非常早期版本的VO元数据外，一般为元数据命名空间+元数据编号的形式，如com.inspur.gs.xxx.vo.xxx；
 * <li>VO元数据作为一个元数据，本身也有一个UUID形式的元数据ID，这个ID也是唯一的，configId与元数据ID的主要区别在于configId更具可读性，
 * 此接口中也有一些成对的方法，功能一致但参数分别为元数据Id和configId；
 * <li>如果你需要创建一个不是你开发的VO的Lcp方法时，需要提供的configId或元数据Id应向VO元数据的开发人员索要；
 * <li>如果你是VO的开发人员，你被询问VO元数据的configId是什么时，VO设计器上提供了属性显示当前BE的configId，你可以从中复制出来发给对方。</ul>
 * <p>下面是此接口的一个常见用法：
 * <blockquote><pre>
 *     IFsManager manager = SpringBeanUtils.getBean(IFSManagerFactory.class).getFSManager("xxx");
 *     manager.retrieve("xxx");
 * </pre></blockquote>
 * <p>如果此类的方法报错，大部分原因都是因为所调用的VO未正确部署，详细的排查方法可以<a href="https://open.inspuronline.com/iGIX/#/document/mddoc/igix-2103%2Fdev-guide-beta%2FFAQ%2Fdefault.md">点击这里</a>查看
 */
public interface IFSManagerFactory {

    /**
     * 根据功能标识configid创建FSManager。
     * <p>
     * 功能与{@link #getFSManagerByVOId(String)}一致，仅参数不同。
     *
     * @param fsType VO的配置标识:configid
     * @return 本地消费代理接口
     * @see IFSManager
     * @see #getFSManagerByVOId(String)
     */
    IFSManager getFSManager(String fsType);

    /**
     * 根据元数据ID创建FSManager。
     * <p>
     * 功能与{@link #getFSManager(String)}一致，仅参数不同。
     *
     * @param voId VO元数据ID
     * @return 本地消费代理接口
     * @see IFSManager
     * @see #getFSManager(String)
     */
    IFSManager getFSManagerByVOId(String voId);

    /**
     * 根据元数据ID创建FSManager。
     * <p>
     * 功能与{@link #getFSManager(String)}一致，仅参数不同。
     *
     * @param voId VO元数据ID
     * @return 本地消费代理接口
     * <p>
     * 目前仅适用于业务流FSManager的创建
     * @see IFSManager
     * @see #getFSManager(String)
     */
    IFSManager getFSManagerByVOIDIgnoreProcessCode(String voId);

    /**
     * 连接，创建功能Session实例。
     *
     * @param fsType              VO功能标识:configid
     * @param parentFuncSessionID 父功能SessionID
     * @return 得到的新功能SessionID
     */
    String connect(String fsType, String parentFuncSessionID);

    /**
     * 连接，创建功能Session实例。
     *
     * @param fsType VO功能标识:configid
     * @return 得到的新功能SessionID
     */
    String connect(String fsType);
    //void tryConnect();

    /**
     * 根据配置Id和sessionId创建Lcp
     *
     * @param fsType        VO的配置标识：configid
     * @param funcSessionID 功能sessionId
     * @return 本地消费代理接口
     * @see #getFSManager(String) (String)
     * @see #getFSManagerByVOId(String) (String)
     * @deprecated 应使用 {@link #getFSManager(String)} (String)}或 {@link #getFSManagerByVOId(String)} (String)}
     */
    IFSManager getFSManager(String fsType, String funcSessionID);
}
